\subsection{XSLT}\label{subsec:xslt}
In questa sezione verranno descritti i punti salienti nello sviluppo dei file XSLT del sito.
\subsubsection{Panoramica}
All'interno del progetto sono stati adoperati dei file di trasformazione XSLT al fine di convertire informazioni contenute all'interno di file XML in porzioni di codice XHTML Strict, da notare che l'output di queste trasformazioni non rappresenta una pagina XHTML completa, uno script Perl preleverà le porzioni in output dalle varie trasformazioni XSLT e le comporrà per formare la pagina XHTML finale.
Non tutte le informazioni contenute nei file XML necessitano di una rappresentazione in XHTML, sono stati quindi sviluppati i seguenti file XSLT:
\begin{itemize}
\item AlgorithmStyle.xsl;
\item breadcrumb.xsl;
\item FaqStyle.xsl;
\item ForumAlgorithmStyle.xsl;
\item ForumStyle.xsl;
\item header.xsl;
\item HelpStyle.xsl;
\item navigator.xsl;
\item NewsStyle.xsl.
\end{itemize}

Questi file sono contenuti all'interno della cartella ``xslt'' contenuta nella radice del sito.
Questi file di trasformazione si distinguono principalmente in due gruppi:\\
breadcrumb.xsl, header.xsl e navigator.xsl si occupano di generare la porzione di codice XHTML preliminare della pagina, come ad esempio la definizione del tag \texttt{<head>}, la scrittura dei breadcrumb e la scrittura del menù di navigazione, mentre le rimanenti trasformazioni riguardano un contenuto specifico per una pagina, come ad esempio la pagina di visualizzazione degli algoritmi o delle pagine di help.
I file XSLT sono stati realizzati principalmente da Riccardo Tesselli e Christian Cardin, col contributo di Andrea Scaboro, che si è occupato di apportare delle correzioni e modifiche al codice XHTML generato ove necessario, e Stefano Tombolini, che si è occupato dei file di trasformazione relativi al forum.

\subsubsection{File di trasformazione per la parte preliminare della pagina}
I file breadcrumb.xsl, header.xsl e navigator.xsl compongono la parte preliminare della pagina come descritto nella sezione precedente. La struttura di questi file XSLT è molto simile. Inizialmente viene definita una variabile tramite il tag \texttt{<xsl:variable>} chiamata ``\texttt{pageId}'', il valore di questa variabile verrà settato tramite l'uso del marcatore ``\texttt{\_\_PAGEID\_\_}'' dallo script Perl che si occupa di comporre la pagina, in dettaglio il marcatore sarà sostituito con l'id della pagina che si intende visualizzare. L'id della pagina deve corrispondere a un qualche valore dell'attributo ``\texttt{linkId}'' del tag \texttt{<page>} all'interno del file PageHeader.xml, nel caso il valore della variabile non corrisponda a un id definito la trasformazione può produrre un output vuoto (nel caso di header.xsl), oppure una porzione di codice XHTML che possa gestire questa situazione.\\
Il file header.xsl applica la trasformazione sul nodo pagina corrispondente all'id selezionato, in output produce la porzione di codice XHTML che definisce il tag \texttt{<head>}. In particolare definisce il titolo della pagina, i vari tag meta (Content-type, titolo, descrizione, keywords, autore), i fogli di stile e gli script, tutte queste informazioni sono prelevate dal file PageHeader.xml.\\
Il file breadcrumb.xsl, a partire dalle informazioni contenute in PageHeader.xml, produce la porzione di codice XHTML per visualizzare i breadcrumb per una certa pagina, senza produrre link circolari. Oltre a definire la variabile ``\texttt{pageId}'' descritta in precedenza, definisce una ulteriore variabile ``\texttt{precursor}'', che viene settata al valore dell'id della pagina padre della pagina con id richiesto. Per produrre i breadcrumb viene utilizzato un approccio ricorsivo. Se l'id della pagina è uguale al proprio precursore, allora nessuna chiamata ricorsiva viene eseguita e viene prodotto direttamente l'output, altrimenti viene applicata la ricorsione sul predecessore della pagina e visualizzato il titolo della pagina corrente senza il tag \texttt{<a>} per evitare il link circolare. La chiamata ricorsiva si applica sulla pagina padre, la condizione di arresto è soddisfatta quando l'id della pagina corrente equivale all'id della pagina padre. Nel caso la condizione di arresto non è soddisfatta viene eseguita la chiamata ricorsiva sui rimanenti nodi e aggiunto il tag \texttt{<a>} e un simbolo di separazione.\\
Il file navigator.xsl a partire dalle informazioni contenute in PageHeader.xml produce la porzione di codice XHTML per visualizzare il menù di navigazione, in modo che non ci siano link circolari. La trasformazione XSLT viene applicata al nodo \texttt{<nav>} del file PageHeader.xml (descritto nella sezione \ref{subsec:pageheader}). Per i nodi \texttt{<link>} viene scritto un tag XHTML \texttt{<li>} e richiamato il template per la scrittura del link, mentre per i nodi \texttt{<toplink>}, ossia elementi che contengono sotto-elementi, viene scritto il tag \texttt{<li>}, richiamato il template per la scrittura del link e scritto il tag \texttt{<ul>}, quindi per ogni nodo \texttt{<sublink>} viene richiamato il template per la scrittura del link. Il template che scrive il link effettua un controllo per evitare la creazione di link circolari all'interno della pagina, per fare questo sono stati adottati i tag \texttt{<xsl:choose>}, \texttt{<xsl:when>} e \texttt{<xsl:otherwise>}.

\subsubsection{File di trasformazione per contenuti}
I file AlgorithmStyle.xsl, FaqStyle.xsl, ForumAlgorithmStyle.xsl, ForumStyle.xsl, HelpStyle.xsl e NewsStyle.xsl sono i file di trasformazione che vengono applicati sui dati in formato XML descritti in \ref{sec:xml} e producono una porzione di codice XHTML che visualizza tali informazioni.\\
Il file AlgorithmsStyle.xsl tramite l'uso di un marcatore ``\texttt{\_\_IDALG\_\_}'' visualizza le informazioni di un certo algoritmo per un determinato id. È stata data particolare attenzione alla rappresentazione dei voti per il dato algoritmo, infatti viene calcolata la media dei voti per l'algoritmo. Dopodiché la trasformazione XSLT si occupa di produrre il codice per la visualizzazione dei commenti.\\
Il file FaqStyle.xsl si occupa di produrre il codice XHTML per la visualizzazione di tutte le FAQ inserite nel file FAQ.xml, è stata prestata particolare attenzione ad eliminare gli spazi per permettere i link interni alla pagina.\\
Il file ForumAlgorithmsStyle.xsl si occupa di produrre codice XHTML che, data una determinata categoria e sottocategoria fornita dall'uso di marcatori, visualizza l'elenco degli algoritmi per quella determinata sottocategoria. È stata posta una particolare attenzione per la rappresentazione grafica (con alternativa testuale) del voto medio di ogni algoritmo. Per farlo è stata calcolata la media dei voti per ogni algoritmo e a seconda del voto risultante viene visualizzata una immagine diversa con l'alternativa testuale corretta. Il marcatore ``\texttt{\_\_NEW\_ALG\_LINK\_\_} è il marcatore che si occupa di definire la posizione per la stringa dinamica che a seconda se l'utente è loggato al sito o meno visualizza il link per aggiungere un nuovo algoritmo. Lo stesso marcatore viene usato anche nel file ForumStyle.xsl. \\
Il file ForumStyle.xsl si occupa di produrre il codice XHTML che visualizza l'elenco delle categorie di algoritmi. Tramite l'uso di espressioni XPath vengono calcolate alcune statistiche.\\
Il file HelpStyle.xsl si occupa di produrre il codice XHTML che visualizza una determinata pagina di help dato il suo id, impostato da Perl tramite l'uso di un marcatore. Essendo il tag \texttt{<content>} un tag a contenuto misto sono state utilizzati comandi \texttt{<xsl:apply-templates>} per applicare ricorsivamente i vari template a seconda dei nodi contenuti all'interno del tag \texttt{<content>}.\\
Il file NewsStyle.xsl si occupa di produrre il codice XHTML per la visualizzazione delle news di un determinato anno, che viene impostato tramite il marcatore \texttt{\_\_YEAR\_\_}.